﻿package CutLoad.cookies
{
	import CutLoad.Base;
	
	/**
	 * 简单的数组封装 
	 * @author smallerbird
	 * 
	 */
	public class CArray
	{	
		/**
		 * 返回一个数组里面的元素是从start到end,例如：getNumArray(1,5) 返回的数组:[1,2,3,4,5]
		 * @param start 起始数
		 * @param end 结束数
		 * @return 
		 * 
		 */		
		public static function getNumArray(start:Number,end:Number):Array{
			if(end<=start) throw new Error("end必须大于start");
			var arr:Array=new Array();
			for(var i:Number=start;i<=end;i++){
				arr.push(i);
			}
			return arr;
		}
		/**
		 * 从数1到数2按一定的间隔分割获得截点数组,例如:plitNumToArr(1,10,3) 将返回:1,4,7,10
		 * @param start 起始数
		 * @param end 结束数
		 * @param space 间隔
		 * @return 
		 * 
		 */
		public static function getSplitNumToArr(start:Number,end:Number,space:Number):Array{
			if(end<=start) throw new Error("end必须大于start");
			var arrTem:Array=new Array();
			var indexTem:Number=start;
			while(indexTem<=end){
				arrTem.push(indexTem);
				indexTem+=space;
			}
			return arrTem;
		}
		/**
		 * 从数1到数2分成指定的份数，获得截点数组,例如：getSplitCountToArr(1,100,3)   将返回:1,35,69
		 * @param start 起始数
		 * @param end 结束数
		 * @param count 份数
		 * @param isResultStartRand 
		 * @return 
		 * 
		 */		
		public static function getSplitCountToArr(start:Number,end:Number,count:Number,isResultStartRand:Boolean=false):Array{
			if(end<=start) throw new Error("end必须大于start");
			var space:Number=Math.ceil((end-start+1)/count);
			var arrResult:Array=getSplitNumToArr(start,end,space);
			if(isResultStartRand){
				var arrTem:Array=getNumArray(arrResult[0],arrResult[1]-1);
				arrResult[0]=RandNO.getRndThisSome(arrTem);
			} 
			return arrResult;
		}
		/**
		 * 对一个一维数组里的数据进分页，结果返回一个二维数组  [1,2,3,4,5]  ===>每页显示2个===>[[1,2],[3,4],[5]] 
		 * @param arr 要分的数组
		 * @param pageSize 每页显示几个数字
		 * @return 
		 * 
		 */		
		public static function getSpliteArrToSomeArr(arr:Array,pageSize:Number):Array {
			var arrReturn:Array=new Array();
			var pageCount:Number=0;
			if (arr.length<=pageSize) {
				pageCount=1;
			} else {
				pageCount=Math.ceil(arr.length/pageSize);
			}
			if (pageCount==1) {
				var arrReturn_tem1:Array=new Array();
				for (var k:Number=0; k<arr.length; k++) {
					arrReturn_tem1.push(arr[k]);
				}
				arrReturn.push(arrReturn_tem1);
				return arrReturn;
			}
			for (var i:Number=0; i<arr.length; i+=pageSize) {
				var arrReturn_tem:Array=new Array();
				for (var j:Number=0; j<pageSize; j++) {
					var index:Number=i+j;
					if(index<arr.length){
						arrReturn_tem.push(arr[index]);
					}
				}
				arrReturn.push(arrReturn_tem);
			}
			return arrReturn;
		}
		/**
		 * 对数组中的每一项执行函数
		 * @param toDo 格式：function(数组元素:*)  或  function(数组元素:*,下标:Number)
		 * 
		 */		
		public function forEach(toDo:Function):void{
			for(var i:Number=0;i<arrGroup.length;i++){
				try{
					toDo(arrGroup[i]);
				}catch(e:ArgumentError){
					toDo(arrGroup[i],i);
				}
			}
		}
		private var arrGroup:Array=new Array();
		/**
		 * 内部数组清零 
		 * 
		 */		
		public function clrAll():void{
			this.arrGroup=new Array();
		}
		/**
		 * 清除重复的元素 ,注：判断的条件是==
		 * 
		 */		
		public function clrRepeat():void{
			arrGroup=Fun.clrArrayRepeat(arrGroup);
		}
		/**
		 * 获得内部数组 
		 * @return 
		 * 
		 */		
		private function getData():Array{
			return this.arrGroup;
		}
		/**
		 * 内部数组 
		 * @return 
		 * 
		 */		
		public function get data():Array{
			return getData();
		}
		/**
		 * 内部数组 
		 * @param arr
		 * 
		 */		
		public function set data(arr:Array):void{
			this.arrGroup=arr;
		}
		/**
		 * 长度 
		 * @return 
		 * 
		 */		
		public function get length():Number{
			return this.arrGroup.length;
		}
		/**
		 * 获得一个元素 
		 * @param index
		 * @return 
		 * 
		 */		
		public function getOne(index:Number):Object{
			if(index<0||index>arrGroup.length-1) return null;
			return this.arrGroup[index]
		}
		/**
		 * 设置某一个元素值 
		 * @param index
		 * @param arrValue
		 * 
		 */		
		public function setOne(index:Number,arrValue:*):void{
			this.arrGroup[index]=arrValue
		}
		/**
		 * 返回某一个元件在这个对齐组里的编号,如果返回为-1说明不存在。
		 * @param o 要查找的对象 
		 * @return 返回某一个元件在这个对齐组里的编号,如果返回为-1说明不存在。
		 * 
		 */		
		public function getIndex(o:Object):Number{
			if(arrGroup.length==0) return -1;
			for(var i:Number=0;i<arrGroup.length;i++){
				if(arrGroup[i]==o){
					return i
				}
			}
			return -1
		}
		/**
		 * 搜索一个元素,一个一个元素的比较 ,找第一个出现的索引返回
		 * @param o 要比较的值
		 * @param strProperties 如果要比较的是“比较的值”里的一个属性，这里可以写上属性的名称，如果不是就保留为空
		 * @param isDel  设置如果找到，是否要删除它,默认为false
		 * @return 返回值：-1没有找到，其它代码下标
		 * 
		 */		
		public function seachOne(o:String,strProperties:String="",isDel:Boolean=false):Number{
			if(arrGroup.length==0) return -1;
			for(var i:Number=0;i<arrGroup.length;i++){
				if(strProperties!=""){
					if(arrGroup[i][strProperties]==o){
						if(isDel){
							this.del(null,i);
						}
						return i;
					}
				}else{
					if(arrGroup[i]==o){
						if(isDel){
							this.del(null,i);
						}
						return i;
					}
				}
				
			}
			return -1;
		}
		/**
		 * 添加进去
		 * @param o 要添加的对象
		 * @param isCheck 添加的时候是否要检测，里面是否已有这个元件。开启为true,默认为false ,注：开启影响一些速度
		 * @return 返回该元件添加进去后的编号，如果返回-1，说明添加失败.
		 * 
		 */		
		public function add(o:Object,isCheck:Boolean=false):Number{
			if(isCheck){
				var indexCheck:Number=getIndex(o)
				if(indexCheck!=-1){
					return indexCheck;
				}
			}
			arrGroup.push(o);
			//
			return arrGroup.length-1
		}
		/**
		 * 取消一个对象
		 * @param o 要删除的对象
		 * @param index 在该对齐组的编号,获得方式，请参考add(..)或getIndex(..)  默认为null,如果为空,函数会遍历所有元件，并获得编号，会影响效率，所以最后设置编号。
		 * @return 删除成功true,删除失败false
		 * 
		 */		
		public function del(o:Object,index:Number=-1):Boolean{
			if(o==null&&index>arrGroup.length-1) throw new Error("索引过界!");
			if(index==-1){
				index=getIndex(o);
				//如果不存在
				if(index==-1) return false;
			}else{
				//编号有误
				if(o!=null&&arrGroup[index]!=o) return false
			}
			this.arrGroup.splice(index,1);
			//
			return true;
		}
		/**
		 * 打印数据结构
		 * @return 
		 * 
		 */	
		public function toString():String{
			var strReturn:String="";
			for(var i:Number=0;i<this.arrGroup.length;i++){
				var strstr:String="";
				for(var j:String in this.arrGroup[i]){
					strstr+=j+":"+this.arrGroup[i][j]+"   ";
				}
				strReturn+=strstr+"\n";
			}
			return strReturn
		}
	}
}